package unq.persistencia;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * TODO: description
 */
public class OperacionesPartido implements Operaciones {

    private PartidoDAO partidoDAO;

    public PartidoDAO getPartidoDAO() {
        return this.partidoDAO;
    }

    public void setPartidoDAO(final PartidoDAO partidoDAO) {
        this.partidoDAO = partidoDAO;
    }

    public OperacionesPartido() {
        this.setPartidoDAO(new PartidoDAO());
    }

    @Override
    public void generarYPersistir() {
        List<Equipo> equipos = new ArrayList<Equipo>();
        List<Partido> partidosComunes = new ArrayList<Partido>();

        equipos = this.partidoDAO.select();

        for (int i = 0; i < 10000; i++) {
            int n1 = new Random().nextInt(16);
            int n2 = new Random().nextInt(16);

            while (n1 == n2) {
                n2 = new Random().nextInt(16);
            }

            Equipo eq1 = equipos.get(n1);
            Equipo eq2 = equipos.get(n2);
            partidosComunes.add(new Partido(eq1, eq2, new Random().nextInt(7), new Random().nextInt(7)));
        }
        this.getPartidoDAO().save(partidosComunes);

    }

    public void historialPorEquipos(final Equipo eq1, final Equipo eq2) {
        List<Partido> partidosXequipos = this.getPartidoDAO().historialPorEquipos(eq1, eq2);
        int cantidadPartidosGanadosEq1 = 0;
        int cantidadPartidosGanadosEq2 = 0;
        int cantidadPartidosEmpatados = 0;

        for (Partido partido : partidosXequipos) {
            if (partido.equipoGanador() == eq1) {
                cantidadPartidosGanadosEq1++;
            } else if (partido.equipoGanador() == eq2) {
                cantidadPartidosGanadosEq2++;
            } else {
                cantidadPartidosEmpatados++;
            }

        }

        System.out.println("Partidos Empatados entre " + eq1.getNombre() + " y " + eq2.getNombre() + ": "
                + cantidadPartidosEmpatados);
        System.out.println("Partidos Ganados por " + eq1.getNombre() + ": " + cantidadPartidosGanadosEq1);
        System.out.println("Partidos Ganados por " + eq2.getNombre() + ": " + cantidadPartidosGanadosEq2);
        System.out.println(partidosXequipos.size());

    }

    private void equiposOrdenados(final String orden) {
        List<Object[]> equipos = this.getPartidoDAO().equiposOrdenados(" cantidad " + orden, "Partido");
        for (Object[] arrays : equipos) {
            System.out.println(((Equipo) arrays[0]).getNombre() + "---" + arrays[1]);

        }

    }

    public void equiposOrdenadosAscendente() {
        this.equiposOrdenados("Asc");
    }

    public void equiposOrdenadosDescendente() {
        this.equiposOrdenados("desc");
    }

    public void empatesPorEquipos() {
        Map<TuplaEquipos, Long> empatesPorEquipo = new HashMap<TuplaEquipos, Long>();
        List<Object[]> empates = this.getPartidoDAO().empatesPorEquipos();
        for (Object[] partido : empates) {
            TuplaEquipos tup = new TuplaEquipos((Equipo) partido[0], (Equipo) partido[1]);
            if (empatesPorEquipo.containsKey(tup)) {
                Long cant = empatesPorEquipo.get(tup);
                empatesPorEquipo.put(tup, cant + (Long) partido[2]);
            } else {
                empatesPorEquipo.put(tup, (Long) partido[2]);
            }
        }

        System.out.println(empatesPorEquipo);
    }
}
